package nivel;

import personaje.*;
import grafica.*;
import juego.*;

/**
 * Esta clase modela un stage determinado del juego. El juego no conoce al
 * tablero directamente, sino a través de el. Ventajas: - Mejor modularizacion -
 * Posibilidad de agregar niveles - Facilidad de carga - Manejo independiente al
 * juego
 * 
 * @author Agustin Orge (LU.85538)
 * @author Victoria Martinez de la Cruz (LU.87620)
 */
public class Nivel {

	/** El juego al que esta asociado el nivel */
	protected Juego juego;

	/** El tablero que modela las componentes del nivel */
	protected Tablero tab;

	/** El punaje del juego actual */
	protected Score score;

	/** La instancia de mario asociada al nivel */
	protected Mario mario;

	/** La gravedad que actua en el nivel */
	protected Gravedad gravedad;

	/** La visualizacion del nivel */
	protected GraficaNivel grafica;

	/**
	 * Constructor de nivel. Recive el juego al que quedara asociado y se
	 * encarga de inicializar el Mario, la gravedad, el manejo de las
	 * componentes graficas, y la grafica del nivel
	 * 
	 * @param j
	 *            el juego
	 */
	public Nivel(Juego j) {
		tab = new Tablero();
		juego = j;
		score = juego.getScore();
		mario = new Mario(this);
		gravedad = new Gravedad(this);
		grafica = new GraficaNivel(mario);
	}

	// Comandos

	/**
	 * Metodo utilizado para informale al nivel que el jugador perdio el nivel.
	 * Se encarga de eliminar el nivel para que no quede en ejecucion.
	 */
	public void perdioNivel() {
		juego.perdioNivel();
		gravedad.threadDone();
		try {
			finalize();
		} catch (Throwable e) {
			e.printStackTrace();
		}
	}

	/**
	 * Metodo utilizado para informale al nivel que el jugador gano el nivel. Se
	 * encarga de eliminar el nivel para que
	 */
	public void ganoNivel() {
		juego.ganoNivel();

		try {
			finalize();
		} catch (Throwable e) {
			e.printStackTrace();
		}
	}

	// Consultas

	/**
	 * Retorna el tablero que modela las componentes logicas del nivel
	 * 
	 * @return tablero
	 */
	public Tablero getTablero() {
		return tab;
	}

	/**
	 * Retorna el Mario asociado al nivel
	 * 
	 * @return mario
	 */
	public Mario getMario() {
		return mario;
	}

	/**
	 * Retorna la grafica del nivel
	 * 
	 * @return grafica nivel
	 */
	public GraficaNivel getGrafica() {
		return grafica;
	}

	/**
	 * Retorna la gravedad asociada al nivel
	 * 
	 * @return gravedad
	 */
	public Gravedad getGravedad() {
		return gravedad;
	}

}
